package com.wiselink.naver.productcatalog.response;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.List;

/**
 * 销售选项信息
 */
@Getter
@Setter
@ToString
public class StandardPurchaseOptionGuide {
    /**
     * （销售选项是否可用类别）
     * 只能对属于true的类别设定组合商品。
     * (판매 옵션 사용 가능 카테고리 여부)
     * true인 카테고리에 대해서만 그룹상품 설정이 가능합니다.
     */
    private Boolean useOptionYn;
    /**
     * （销售选项指南目录）
     * 对于可使用销售选项的类别，应设置销售选项指南。
     * (판매 옵션 가이드 목록)
     * 판매 옵션 사용 가능 카테고리의 경우, 판매 옵션 가이드를 설정해야 합니다.
     */
    private List<OptionGuide> optionGuides;

    /**
     * 销售选项指南目录
     */
    @Getter
    @Setter
    @ToString
    public static class OptionGuide {
        /**
         * (向导 ID)
         * (가이드 ID)
         */
        private Long guideId;
        /**
         * （销售选项列表）
         * 指南中包含的选项列表
         * (판매 옵션 목록)
         * 가이드에 포함되는 옵션 목록입니다.
         */
        private List<StandardPurchaseOption> standardPurchaseOptions;
    }

    /**
     * 销售选项
     */
    @Getter
    @Setter
    @ToString
    public static class StandardPurchaseOption {
        /**
         * (销售选项ID)
         * (판매 옵션 ID)
         */
        private Long optionId;
        /**
         * （销售选项名）
         * (판매 옵션명)
         */
        private String optionName;
        /**
         * （搜索曝光（目录）组为准）
         * 显示是否为登记目录所依据的销售选择。 指南内可依据True-in选项注册/管理目录，若不存在True-in选项，则只能以集团商品为单位注册一个目录。
         * (검색 노출(카탈로그) 그룹 기준)
         * 카탈로그를 등록하는 기준이 되는 판매 옵션 여부를 표시합니다. 가이드 내에서 True인 옵션을 기준으로 카탈로그를 등록/관리할 수 있고, True인 옵션이 존재하지 않는 경우에는 그룹상품 단위로 한 개의 카탈로그만 등록이 가능합니다.
         */
        private Boolean modelOptionYn;
        /**
         * （是否使用彩色芯片）
         * 显示是否有可录入色码的销售选择。 以转至集团产品注册API的hex码（#0000格式）作为彩色芯片。
         * (색상칩 사용 여부)
         * 색상 코드 입력이 가능한 판매 옵션 여부를 표시합니다. 그룹상품 등록 API로 전달되는 hex 코드(#000000 형식)가 색상칩으로 사용됩니다.
         */
        private Boolean colorCodeYn;
        /**
         * （销售选项类型）
         * 对于单位存在的数字式销售选择，销售选择值名称应当以数字+单位形式填写，单位只能使用销售选择可用单位名单中的值。
         * NUMBER（数字型）、TEXT（字母型）
         * (판매 옵션 유형)
         * Enum: NUMBER TEXT
         * 단위가 존재하는 숫자형 판매 옵션의 경우 판매 옵션값명을 숫자+단위 형식으로 입력해야 하며, 단위는 판매 옵션 사용 가능 단위 목록에 있는 값만 사용할 수 있습니다.
         * <p>
         * NUMBER(숫자형), TEXT(문자형)
         */
        private String optionType;
        /**
         * (销售选项可用单位列表) unique
         * 单位清单存在的销售选择，销售选择值名称应当使用单位。 列表中不存在的单位不能使用。
         * (판매 옵션 사용 가능 단위 목록) unique
         * 단위 목록이 존재하는 판매 옵션의 경우 판매 옵션값명에 단위가 사용되어야 합니다. 목록에 존재하지 않는 단위는 사용할 수 없습니다.
         */
        private List<OptionUsableUnit> optionUsableUnits;
        /**
         * （销售选项详细说明）
         * 这是为了引导销售者理解销售选项的概念，输入正确的值，对销售选项进行说明的句子。 可在商品登记画面中用于输入销售选项值窗口或工具提示、帮助等。
         * (판매 옵션 상세 설명)
         * 판매자가 판매 옵션의 개념을 이해하고 정확한 값을 입력할 수 있도록 가이드하기 위해, 판매 옵션에 대해 설명하는 문구입니다. 상품 등록 화면에서 판매 옵션값 입력 창이나 툴팁, 도움말 등에 활용할 수 있습니다.
         */
        private OptionInfo optionInfo;
        /**
         * （销售选项值列表）
         * ID为已登记的销售选项值列表，在销售选项值输入窗口自动完成提供，帮助准确输入。 清单中不存在的销售选项值名可以直接录入。
         * (판매 옵션값 목록)
         * ID가 등록되어 있는 판매 옵션값의 목록으로, 판매 옵션값 입력 창에 자동 완성으로 제공하여 정확한 입력을 돕습니다. 목록에 존재하지 않는 판매 옵션값명은 직접 입력할 수 있습니다.
         */
        private List<OptionValue> optionValues;
    }

    /**
     * 销售选项详细说明
     */
    @Getter
    @Setter
    @ToString
    public static class OptionInfo {
        /**
         * （Place Holder 语句信息）
         * 每个销售选项在销售选项值输入窗口中显示的语句。
         * (플레이스홀더 문구 정보)
         * 판매 옵션별로 판매 옵션값 입력 창에 표시되는 문구입니다.
         */
        private String placeHolder;
        /**
         * （输入指南语句信息）
         * 各销售选项工具提示、帮助等显示的句子。
         * (입력 가이드 문구 정보)
         * 판매 옵션별 툴팁, 도움말 등에 표시되는 문구입니다.
         */
        private String tooltip;
    }

    /**
     * 销售选项可用单位
     */
    @Getter
    @Setter
    @ToString
    public static class OptionUsableUnit {
        /**
         * (单位)
         * (단위)
         */
        private String unit;
    }

    /**
     * 销售选项值
     */
    @Getter
    @Setter
    @ToString
    public static class OptionValue {
        /**
         * 销售选项值名
         * 판매 옵션값명
         */
        private String valueName;
    }
}
